#include <stdio.h>
#include "erl_driver.h"

typedef struct {
    ErlDrvPort port;
} example_data;

static ErlDrvData example_drv_start(ErlDrvPort port, char *buff)
{
    example_data *d = (example_data *)driver_alloc(sizeof(example_data));
    d->port = port;
    return (ErlDrvData)d;
}

static void example_drv_stop(ErlDrvData handle)
{
    driver_free((char *)handle);
}

static void example_drv_output(ErlDrvData handle, char *buff, int bufflen)
{
    example_data *d = (example_data *)handle;
    char fn = buff[0], arg = buff[1], res;
    if (fn == 1) {
        res = twice(arg);
    } 
    else if (fn == 2) {
        res = sum(buff[1], buff[2]);
    }
    driver_output(d->port, &res, 1);
}

ErlDrvEntry example_driver_entry = {
    NULL,                   //F_PTR init, N/A
    example_drv_start,      //L_PTR start, 在端口打开时调用
    example_drv_stop,       //F_PTR stop, 在端口关闭时调用
    example_drv_output,     //F_PTR output, 在erlang发送数据到端口时调用
    NULL,                   //F_PTR ready_input
    NULL,                   //F_PTR ready_output
    "example_lid",         //驱动的名字
    NULL,                   //F_PTR finish, 卸载(unload)时调用
    NULL,                   //F_PTR control, port_command回调
    NULL,                   //F_PTR timeout, 保留
    NULL,                   //F_PTR outputv, 保留
};

DRIVER_INIT(example_drv) {  //必须与driver_entry中的名字向匹配
    return &example_driver_entry;
} 
